using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Studio7i.Dominio;
using System.Data.SqlClient;

namespace Studio7i.Persistencia
{
    public class SalaDAO : ISalaDAO
    {

        // REVISAR FOREIGN KEY CodLocal al realizar los metodos CRUD
        // Dependencias
        
        ILocalDAO localDAO = new LocalDAO();

        // Métodos CRUD
        public Sala Crear(Sala salaACrear)
        {
            string _Sentencia = "INSERT INTO sala (CodSala, Nombre, Capacidad, Caracteristicas, CodLocal, Comentarios) VALUES(@CodSala, @Nombre, @Capacidad, @Caracteristicas, @CodLocal, @Comentarios)";
            int _NuevoCodigo = GenerarNuevoCodigo();
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@CodSala", _NuevoCodigo));
                    _Comando.Parameters.Add(new SqlParameter("@Nombre", salaACrear.Nombre));
                    _Comando.Parameters.Add(new SqlParameter("@Capacidad", salaACrear.Capacidad));
                    _Comando.Parameters.Add(new SqlParameter("@Caracteristicas", salaACrear.Caracteristicas));
                    _Comando.Parameters.Add(new SqlParameter("@CodLocal", salaACrear.Local.CodLocal));
                    _Comando.Parameters.Add(new SqlParameter("@Comentarios", (salaACrear.Comentarios == null) ? DBNull.Value.ToString() : salaACrear.Comentarios));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(_NuevoCodigo);
        }
        public Sala Obtener(int CodSala)
        {
            string _Sentencia = @"SELECT CodSala, Nombre, Capacidad, Caracteristicas, CodLocal, Comentarios FROM sala WHERE CodSala=@CodSala";
            Sala salaCreada = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@CodSala", CodSala));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        {
                            salaCreada = new Sala();
                            salaCreada.CodSala= (int)_Resultado["CodSala"];
                            salaCreada.Nombre = (string)_Resultado["Nombre"];
                            salaCreada.Capacidad = (int)_Resultado["Capacidad"];
                            salaCreada.Caracteristicas = (string)_Resultado["Caracteristicas"];
                            salaCreada.Local.CodLocal= (int)_Resultado["CodLocal"];
                            salaCreada.Comentarios = (string)_Resultado["Comentarios"];
                        }
                    }
                }
            }
            return salaCreada;
        }

        public Sala Modificar(Sala salaAModificar)
        {
            string _Sentencia = @"UPDATE sala SET Nombre=@Nombre, Capacidad=@Capacidad, Caracteristicas=@Caracteristicas, Comentarios=@Comentarios WHERE CodSala=@CodSala";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@Nombre", salaAModificar.Nombre));
                    _Comando.Parameters.Add(new SqlParameter("@Capacidad", salaAModificar.Capacidad));
                    _Comando.Parameters.Add(new SqlParameter("@Caracteristicas", salaAModificar.Caracteristicas));
                    _Comando.Parameters.Add(new SqlParameter("@CodLocal", salaAModificar.Local.CodLocal));
                    _Comando.Parameters.Add(new SqlParameter("@Comentarios", salaAModificar.Comentarios));
                    _Comando.Parameters.Add(new SqlParameter("@CodSala", salaAModificar.CodSala));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(salaAModificar.Local.CodLocal);
        }
        public void Eliminar(Sala salaAEliminar)
        {
            string _Sentencia = "DELETE FROM sala WHERE CodSala=@CodSala";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    //_Comando.Parameters.Add(new SqlParameter("@codigo", salaAEliminar.Local.CodLocal));
                    _Comando.Parameters.Add(new SqlParameter("@CodSala", salaAEliminar.CodSala));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        // Métodos Listar
        public ICollection<Sala> ListarTodos()
        {
            string _Sentencia = @"SELECT codSala, Nombre, Capacidad, Caracteristicas, Comentarios FROM sala";
            ICollection<Sala> salasEncontradas = new List<Sala>();
            Sala salaEncontrada = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            salaEncontrada = new Sala();
                            //salaEncontrada.Local.CodLocal = (int)_Resultado["codLocal"];
                            salaEncontrada.CodSala = (int)_Resultado["CodSala"];
                            salaEncontrada.Nombre = (string)_Resultado["Nombre"];
                            salaEncontrada.Caracteristicas = (string)_Resultado["Caracteristicas"];
                            salaEncontrada.Capacidad = (int)_Resultado["Capacidad"];
                            //salaEncontrada.Local = localDAO.Obtener((int)_Resultado["local"]);
                            salaEncontrada.Comentarios = (string)_Resultado["Comentarios"];
                            salasEncontradas.Add(salaEncontrada);
                        }
                    }
                }
            }
            return salasEncontradas;
        }

         public ICollection<Sala> ListarXBusqueda(int? CodSala, string Nombre, int? Capacidad, string Caracteristicas, string Comentarios, Local local)
          {
              string _Sentencia = @"SELECT CodSala, Nombre, Capacidad, Caracteristicas, Comentarios, CodLocal FROM sala WHERE 1=1";
              ICollection<Sala> salasEncontradas = new List<Sala>();
              Sala salaEncontrada = null;
              using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
              {
                  _Conexion.Open();
                  using (SqlCommand _Comando = new SqlCommand())
                  {
                      if (CodSala != null)
                      {
                          _Sentencia = _Sentencia + " AND CodSala=@CodSala";
                          _Comando.Parameters.Add(new SqlParameter("@CodSala", CodSala));
                      }
                      if (Nombre != null)
                      {
                          _Sentencia = _Sentencia + " AND Nombre LIKE '%'+@Nombre+'%'";
                          _Comando.Parameters.Add(new SqlParameter("@Nombre", Nombre));
                      }
                      if (Capacidad != null)
                      {
                          _Sentencia = _Sentencia + " AND Capacidad LIKE '%'+@Capacidad+'%'";
                          _Comando.Parameters.Add(new SqlParameter("@Capacidad", Capacidad));
                      }
                      if (Caracteristicas != null)
                      {
                          _Sentencia = _Sentencia + " AND Caracteristicas LIKE '%'+@Caracteristicas+'%'";
                          _Comando.Parameters.Add(new SqlParameter("@Caracteristicas", Caracteristicas));
                      }
                      if (Comentarios != null)
                      {
                          _Sentencia = _Sentencia + " AND Comentarios LIKE '%'+@Comentarios+'%'";
                          _Comando.Parameters.Add(new SqlParameter("@Comentarios", Comentarios));
                      }
                      if (local != null)
                      {
                          _Sentencia = _Sentencia + " AND CodLocal=@CodLocal";
                          _Comando.Parameters.Add(new SqlParameter("@CodLocal", local.CodLocal));
                      }
                      _Comando.CommandText = _Sentencia;
                      _Comando.Connection = _Conexion;
                      using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                      {
                          while (_Resultado.Read())
                          {
                              salaEncontrada = new Sala();
                              salaEncontrada.CodSala = (int)_Resultado["codSala"];
                              salaEncontrada.Nombre = (string)_Resultado["Nombre"];
                              salaEncontrada.Capacidad = (int)_Resultado["Capacidad"];
                              salaEncontrada.Caracteristicas = (string)_Resultado["Caracteristicas"];
                              salaEncontrada.Comentarios = (string)_Resultado["Comentarios"];
                              salaEncontrada.Local = localDAO.Obtener((int)_Resultado["CodLocal"]);
                              salasEncontradas.Add(salaEncontrada);
                          }
                      }
                  }
              }
              return salasEncontradas;
          }

          
       
        // Métodos de soporte
        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(codSala) FROM sala";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }
            return _NuevoCodigo;
        }

    }
}